#include "duty_cycle_value_menu.h"
#include "menu_config.h"
#include "pwm_generator_config.h"

/* 占空比调节步长宏定义 */
#define DUTY_SHORT_STEP     1   /* 短按步长 */
#define DUTY_LONG_STEP      5   /* 长按步长 */

/* 添加全屏刷新标志位 */
static bool needFullRefresh = true;
/* 显示刷新标志，决定是否需要重绘菜单界面 */
static bool sg_needRefresh = true;
/* 存储最大最小值 */
static uint8_t sg_minValue = 1;   /* 占空比最小值 */
static uint8_t sg_maxValue = 99;  /* 占空比最大值 */
/* 存储实际占空比值 - 实际上与设定值相同，但保持界面一致性 */
static float sg_actualDutyCycle = 0.0f;

/* 定义空的菜单项 */
static cotMenuList_t sg_DutyCycleValueMenuTable[] =
{
    COT_MENU_ITEM_BIND(TEXT_DUTY_MENU, NULL, NULL, NULL, NULL, "Duty Cycle Value"),
};

/* 显示函数 */
static void ShowDutyCycleValueMenu(cotMenuShow_t *ptShowInfo)
{
    if (!sg_needRefresh)
    {
        return;
    }

    if (needFullRefresh)
    {
        /* 清屏 */
        LCD_Clear();

        /* 显示标题 */
        const char *pszSelectDesc = get_text((TextId_e)ptShowInfo->uMenuDesc.textId);
        uint16_t titleX = CALC_TITLE_CENTER_X(pszSelectDesc, LCD_W);
        LCD_ShowString(titleX, 0, (uint8_t *)pszSelectDesc, g_point_color, g_back_color, MENU_FONT_SIZE, 0);

        /* 画分隔线 */
        LCD_DrawLine(0, MENU_FONT_SIZE, LCD_W - 1, MENU_FONT_SIZE, g_point_color);
        
        /* 显示标签 */
        LCD_ShowString(10, 40, (uint8_t *)"Set:", g_point_color, g_back_color, 32, 0);
        LCD_ShowString(10, 110, (uint8_t *)"Real:", g_point_color, g_back_color, 32, 0);

        needFullRefresh = false;
    }

    /* 获取占空比实际值 - 占空比没有误差，实际值等于设定值 */
    sg_actualDutyCycle = (float)g_tPWMParam.dutyCycle;

    /* 显示设定占空比 */
    char valueStr[20];
    sprintf(valueStr, " %d%% ", g_tPWMParam.dutyCycle);
    
    /* 计算设定占空比居中位置并显示 */
    uint16_t setValueX = CALC_TITLE_CENTER_X(valueStr, LCD_W);
    LCD_ShowString(setValueX, 75, (uint8_t *)valueStr, g_point_color, g_back_color, 32, 0);
    
    /* 显示实际占空比 */
    sprintf(valueStr, " %.1f%% ", sg_actualDutyCycle);
    
    /* 计算实际占空比居中位置并显示 */
    uint16_t realValueX = CALC_TITLE_CENTER_X(valueStr, LCD_W);
    LCD_ShowString(realValueX, 145, (uint8_t *)valueStr, g_point_color, g_back_color, 32, 0);
    
    sg_needRefresh = false;
}

/* 按键回调函数 - 上键(KEY0) */
static void OnKey0FunCB(cotKey_t key)
{
    /* 处理按键短按和长按 */
    if (!cotKey_IsLongPress(key))
    {
        if (cotKey_IsTriggerWayMet(key, COT_KEY_TRIGGER_WAY_PRESS)) /* 按下首次触发 */
        {
            /* 预留：首次按下按键时的处理 */
        }
        if (cotKey_IsTriggerWayMet(key, COT_KEY_TRIGGER_WAY_LOSSEN)) /* 识别到短按 */
        {
            /* 增加占空比 */
            uint8_t newValue = g_tPWMParam.dutyCycle + DUTY_SHORT_STEP;
            if (newValue <= sg_maxValue)
            {
                PWM_Generator_UpdateDutyCycle(newValue);
                sg_needRefresh = true;
            }
        }
    }
    else
    {
        if (cotKey_IsTriggerWayMet(key, COT_KEY_TRIGGER_WAY_PRESS)) /* 识别到长按 */
        {
            /* 长按增加占空比 */
            uint8_t newValue = g_tPWMParam.dutyCycle + DUTY_LONG_STEP;
            if (newValue <= sg_maxValue)
            {
                PWM_Generator_UpdateDutyCycle(newValue);
                sg_needRefresh = true;
            }
        }
        if (cotKey_IsTriggerWayMet(key, COT_KEY_TRIGGER_WAY_LOSSEN)) /* 长按松开 */
        {
            /* 预留：长按上键松手时的处理 */
        }
    }
}

/* 按键回调函数 - 下键(KEY1) */
static void OnKey1FunCB(cotKey_t key)
{
    /* 处理按键短按和长按 */
    if (!cotKey_IsLongPress(key))
    {
        if (cotKey_IsTriggerWayMet(key, COT_KEY_TRIGGER_WAY_PRESS)) /* 按下首次触发 */
        {
            /* 预留：首次按下按键时的处理 */
        }
        if (cotKey_IsTriggerWayMet(key, COT_KEY_TRIGGER_WAY_LOSSEN)) /* 识别到短按 */
        {
            /* 减少占空比 */
            uint8_t newValue = g_tPWMParam.dutyCycle;
            if (newValue >= sg_minValue + DUTY_SHORT_STEP)
            {
                newValue -= DUTY_SHORT_STEP;
                PWM_Generator_UpdateDutyCycle(newValue);
                sg_needRefresh = true;
            }
        }
    }
    else
    {
        if (cotKey_IsTriggerWayMet(key, COT_KEY_TRIGGER_WAY_PRESS)) /* 识别到长按 */
        {
            /* 长按减少占空比 */
            uint8_t newValue = g_tPWMParam.dutyCycle;
            if (newValue >= sg_minValue + DUTY_LONG_STEP)
            {
                newValue -= DUTY_LONG_STEP;
                PWM_Generator_UpdateDutyCycle(newValue);
                sg_needRefresh = true;
            }
        }
        if (cotKey_IsTriggerWayMet(key, COT_KEY_TRIGGER_WAY_LOSSEN)) /* 长按松开 */
        {
            /* 预留：长按下键松手时的处理 */
        }
    }
}

/* 按键回调函数 - 确认键(KEY2) */
static void OnKey2FunCB(cotKey_t key)
{
    /* 处理按键短按和长按 */
    if (!cotKey_IsLongPress(key))
    {
        if (cotKey_IsTriggerWayMet(key, COT_KEY_TRIGGER_WAY_PRESS)) /* 按下首次触发 */
        {
            /* 预留：首次按下按键时的处理 */
        }
        if (cotKey_IsTriggerWayMet(key, COT_KEY_TRIGGER_WAY_LOSSEN)) /* 识别到短按 */
        {
            /* 保存参数 */
            PWM_Generator_SaveConfig();
            /* 返回上级菜单 */
            cotMenu_Exit(false);
        }
    }
    else
    {
        if (cotKey_IsTriggerWayMet(key, COT_KEY_TRIGGER_WAY_PRESS)) /* 识别到长按 */
        {
            /* 保存参数并返回主菜单 */
            PWM_Generator_SaveConfig();
            while (cotMenu_Exit(true) == 0)
            {
            }
        }
        if (cotKey_IsTriggerWayMet(key, COT_KEY_TRIGGER_WAY_LOSSEN)) /* 长按松开 */
        {
            /* 预留：长按确认键松手时的处理 */
        }
    }
}

/* 进入回调函数 */
void OnDutyCycleValueMenuEnter(const cotMenuItemInfo_t *ptItemShowInfo)
{
    /* 绑定菜单表和显示函数 */
    cotMenu_Bind(sg_DutyCycleValueMenuTable, COT_GET_MENU_NUM(sg_DutyCycleValueMenuTable), ShowDutyCycleValueMenu);
    
    /* 从参数管理器获取占空比最大最小值 */
    const cotParamInfo_t *pParamInfo = GetParamInfo(&g_tPWMParam.dutyCycle);
    if (pParamInfo != NULL)
    {
        sg_minValue = *pParamInfo->unMinValuePtr.pUint8;
        sg_maxValue = *pParamInfo->unMaxValuePtr.pUint8;
    }
}

/* 加载回调函数 */
void LoadDutyCycleValueMenu(const cotMenuItemInfo_t *ptItemShowInfo)
{
    /* 注册按键回调 */
    cotKey_Listen(KEY0, OnKey0FunCB);
    cotKey_Listen(KEY1, OnKey1FunCB);
    cotKey_Listen(KEY2, OnKey2FunCB);

    /* 配置按键模式 */
    cotKey_ConfigLongPressMode(KEY0, 1200, 400); /* 上键长按1.2秒触发,每0.4秒重复一次 */
    cotKey_ConfigLongPressMode(KEY1, 1200, 400); /* 下键长按1.2秒触发,每0.4秒重复一次 */
    cotKey_ConfigLongPressMode(KEY2, 2000, 0);   /* SET键长按2秒触发,不重复 */
    
    /* 标记需要刷新且全屏刷新 */
    sg_needRefresh = true;
    needFullRefresh = true;
}

/* 任务回调函数 */
void DutyCycleValueMenuTask(const cotMenuItemInfo_t *ptItemShowInfo)
{
    /* 预留：可在此添加菜单定时刷新、动画等功能 */
}
